/**
 * 
 */
package com.glela.redis.service;

import java.util.Date;
import java.util.Timer;
import java.util.TimerTask;

import javax.annotation.PostConstruct;

import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Repository;

import com.glela.cache.redis.RedisKeys;
import com.glela.cache.redis.RedisUtil;

/**
 * @author liujie
 *
 */
@Repository
public class LoadCacheDataService {

	private static Logger logger = LoggerFactory.getLogger(LoadCacheDataService.class);
	
// 	@Autowired
//	private VideoInfoNewMapper videoMapper;
	
	@Autowired
	private RedisUtil redisUtil;
	
	@PostConstruct
	public void initialize(){
 		autocomplete();
	}
	
	public void reloadData(){
		redisUtil.flushDB();
		loadCacheData();
	}
	
	//2016-04-12 udpate by liujie
	public void reloadVideoData(){
		redisUtil.delKeysLike(RedisKeys.VIDEO_AREA_PUT_PREFIX+"*");
		redisUtil.delKeysLike(RedisKeys.VIDEO_ALL_AREA_PUT_PREFIX+"*");
		redisUtil.delKeysLike(RedisKeys.VIDEO_BASE_PREFIX+"*");
		redisUtil.delKeysLike(RedisKeys.TITLE_VIDEO_PREFIX+"*");
		redisUtil.delKeysLike(RedisKeys.DESC_VIDEO_PREFIX+"*");
		redisUtil.del(RedisKeys.VIDEO_TIME_SORT);
		redisUtil.delKeysLike(RedisKeys.CLASSIFY_VIDEO_PREFIX.substring(0,RedisKeys.CLASSIFY_VIDEO_PREFIX.indexOf("{"))+"*");
		redisUtil.delKeysLike(RedisKeys.LABEL_VIDEO_PREFIX.substring(0,RedisKeys.LABEL_VIDEO_PREFIX.indexOf("{"))+"*");
		redisUtil.delKeysLike(RedisKeys.VIDEO_ATTACH_PREFIX+"*");
		loadCacheVideoData();
	}
	
	private void loadCacheVideoData(){
//		loadVideoBaseInfo(); 
//		loadVideoAttachInfo();
	}
	 
	private void loadCacheData(){
		
		logger.info("begin load cache data...");
		/************加载视频相关业务数据***************/
		loadCacheVideoData();
		
		logger.info("cache data is loaded.");
	}
	
	/**
	 * 同步发生变更的缓存数据到关系型数据库
	 */
//	@SuppressWarnings("unchecked")
//	private void updateCacheData() {
//		//待更新队列
//		String[] waitKeys = new String[]{
//				RedisKeys.VIDEO_ATTACH_UPDATES
////				,RedisKeys.PUT_VIDEO_ATTACH_UPDATES
//			};
//		
//		Set<String> vids = null;
//		List<VideoBaseInfo> vinfos = null;
//		List<String> values;
//		String key = "";
//		try {
//			
//			for(String waitKey : waitKeys){
//				key = waitKey;
//				logger.info("redis回写即将开始, key == "+key);
//				vids = redisUtil.smembers(key);
//				redisUtil.del(key);
//				if(vids == null || vids.size() == 0) {
//					continue;
//				}
//				
//				logger.info("准备更新, videoIds == "+vids);
//				values = new ArrayList<String>();
//				for(String id : vids){
//					values.add(RedisKeys.VIDEO_BASE_PREFIX + id);
//				}
// 				List<String> videosStr = new ArrayList<>();
//				//去除空数据
//				for(String value : redisUtil.mget(values.toArray(new String[]{}))) {
//					if(value != null && !"".equals(value)) {
//						videosStr.add(value);
//					}
//				}
//				if(videosStr == null || videosStr.size() == 0) {
//					continue;
//				}
//				
//				vinfos = (List<VideoBaseInfo>) JsonUtil.toBeans(videosStr.toString(), new TypeReference<List<VideoBaseInfo>>(){});
//				for(VideoBaseInfo info:vinfos){
//					Long count = redisUtil.lrem(RedisKeys.VIDEO_CLICK_RECORD_LIST, 0, info.getId().toString());
//					count = count==null?0l:count;
//					if(count == 0l){
//						continue;
//					}
//					Integer clickNum = info.getAttachInfo().getClickNum();
//					clickNum = clickNum==null?0:clickNum;
//					info.getAttachInfo().setClickNum(clickNum+count.intValue());
//					redisUtil.set(RedisKeys.VIDEO_BASE_PREFIX + info.getId(), info);
//				}
//				switch(key){//批量更新attach数据
//					case RedisKeys.VIDEO_ATTACH_UPDATES:
//						videoMapper.updateVideoAttahBatch(vinfos);
//						break;
// 				}//end switch(key){//批量更新attach数据
//				
//			}//end for(String key : waitKeys){
//		} catch (Exception e) {
//			logger.error("updateCacheData异常",e);
//			if(vids != null) {
//				for(String id : vids){//更新数据失败时，重新加入待更新队列
//					redisUtil.sadd(key, id);
//				}
//			}
//		}//end try {
//	}
	
	/**
	 * 数据自动更新 重新加载内容 逐一进行copy 逐一进行赋值 减少
	 */
	private void autocomplete(){
		//清空数据
		//2016-04-26 udpate by liujie
//		redisUtil.flushDB();
//		loadCacheData();
		long now = System.currentTimeMillis();
		Timer noticeTimer = new Timer();
 		noticeTimer.scheduleAtFixedRate(new TimerTask(){
			@Override
			public void run() {
//				updateCacheData();
			}
		}, new Date(now + 1000 * 60) , 1000 * 10);
	}
	
	
 	 
 	/**
	 * 加载所有视频基本信息 videoId - videoBaseObj
	 */
//	private void loadVideoBaseInfo(){
//		List<VideoBaseInfo> list = videoMapper.queryAllVideoBaseInfo( );
//		if(list == null || list.size() == 0) {
//			return ;
//		}
//   		ShardedJedis jedis = null;
//		try {
//			jedis = redisUtil.getJedis();
// 			ShardedJedisPipeline pipeline = jedis.pipelined();
//			String key,value;
//			String[] strArr;
//			for(VideoBaseInfo item : list){
//				double price = item.getPrice();
//				if(price>0){
//					item.setIntegral(price*VideoConfigConstant.IntergralRat);
//				}else{
// 					item.setIntegral(0d);
// 				}
//				
//				/**************************填充videobase数据******************************************/
//				//特定的投放区域 投放缓存区 建立
//				if(item.getAreaPutFlag() > 0 ){
//					long videoId = item.getId();
//					List<String> areaList = videoMapper.queryVideoPutAreaInfo(videoId);
//					for(String area:areaList){
//						key = RedisKeys.VIDEO_AREA_PUT_PREFIX+area;
// 						//搭建区域缓存
// 						redisUtil.sadd(key, String.valueOf(videoId));
//						redisUtil.sadd(RedisKeys.VIDEO_ALL_AREA_PUT_PREFIX, String.valueOf(videoId));
// 						logger.info("loadVideoBaseInfo	加载视频基础数据	key:{},value:{}",new Object[]{key,videoId}); 
// 					}
//				}
// 				key = RedisKeys.VIDEO_BASE_PREFIX + item.getId();
//				value = JsonUtil.toJson(item);
//				pipeline.set(SafeEncoder.encode(key), SafeEncoder.encode(value));
//				logger.info("loadVideoBaseInfo	加载视频基础数据	key:{},value:{}",new Object[]{key,value}); 
// 				 
// 				/**************************填充videoname2videoid数据******************************************/
//				key = item.getName();
//				if(key != null && !key.trim().isEmpty()){
//					key = RedisKeys.TITLE_VIDEO_PREFIX + key;
//					pipeline.sadd(SafeEncoder.encode(key), SafeEncoder.encode(item.getId().toString()));
//					logger.info("loadVideoBaseInfo	加载视频名称-视频ID数据	key:{},value:{}",new Object[]{key,item.getId()});
//				}
//				
//				/**************************填充videodesc2videoid数据******************************************/
//				key = item.getDescription();
//				if(key != null && !key.trim().isEmpty()){
//					key = RedisKeys.DESC_VIDEO_PREFIX + key;
//					pipeline.sadd(SafeEncoder.encode(key), SafeEncoder.encode(item.getId().toString()));
//					logger.info("loadVideoBaseInfo	加载视频说明-视频ID数据	key:{},value:{}",new Object[]{key,item.getId()});
//				}
//				
//				/**************************填充updatetime2videoid数据******************************************/
//				if(item.getTime() != null){
//					pipeline.zadd(SafeEncoder.encode(RedisKeys.VIDEO_TIME_SORT), item.getTime().getTime(),SafeEncoder.encode(item.getId().toString()));
//					logger.info("loadVideoBaseInfo	加载更新时间-视频ID数据	key:{},value:{}",new Object[]{RedisKeys.VIDEO_TIME_SORT,item.getId()});
//				}
//				
//				/**************************填充brand2videoid数据******************************************/
//				key = item.getBrandName();
//				if(key != null && !key.trim().isEmpty()){
//					key = MessageFormat.format(RedisKeys.BRAND_VIDEO_PREFIX, item.getBrandId().toString(),key);
//					pipeline.sadd(SafeEncoder.encode(key), SafeEncoder.encode(item.getId().toString()));
//					logger.info("loadVideoBaseInfo	加载品牌名称-视频ID数据	key:{},value:{}",new Object[]{key,item.getId()});
//				}
//				
//				/**************************填充classify2videoid数据******************************************/
//				key = item.getClassifyName();
//				if(key != null && !key.trim().isEmpty()){
//					key = MessageFormat.format(RedisKeys.CLASSIFY_VIDEO_PREFIX, item.getClassifyId().toString(),key);
//					pipeline.sadd(SafeEncoder.encode(key), SafeEncoder.encode(item.getId().toString()));
//					logger.info("loadVideoBaseInfo	加载分类名称-视频ID数据	key:{},value:{}",new Object[]{key,item.getId()});
//				}
//				
//				/**************************填充label2videoid数据******************************************/
//				if(item.getLabelInfo() != null){
//					strArr = item.getLabelInfo().split(",");
//					for(String str : strArr){
//						key = MessageFormat.format(RedisKeys.LABEL_VIDEO_PREFIX, str.split("[|]")[0],str.split("[|]")[1]);
//						pipeline.sadd(SafeEncoder.encode(key), SafeEncoder.encode(item.getId().toString()));
//						logger.info("loadVideoBaseInfo	加载标签名称-视频ID数据	key:{},value:{}",new Object[]{key,item.getId()});
//					}
//				}
//				
//				/**************************填充hideLabel2videoid数据******************************************/
//				if(item.getHideLabelInfo() != null){
//					strArr = item.getHideLabelInfo().split(",");
//					for(String str : strArr){
//						key = MessageFormat.format(RedisKeys.HLABEL_VIDEO_PREFIX, str.split("[|]")[0],str.split("[|]")[1]);
//						pipeline.sadd(SafeEncoder.encode(key), SafeEncoder.encode(item.getId().toString()));
//						logger.info("loadVideoBaseInfo	加载暗标签名称-视频ID数据	key:{},value:{}",new Object[]{key,item.getId()});
//					}
//				}
//				
//				/**************************填充clumn2videoid数据******************************************/
//				if(item.getColumnInfo() != null){
//					strArr = item.getColumnInfo().split(",");
//					for(String str : strArr){
//						key = MessageFormat.format(RedisKeys.COLUMN_VIDEO_PREFIX, str.split("[|]")[0],str.split("[|]")[1]);
//						pipeline.sadd(SafeEncoder.encode(key), SafeEncoder.encode(item.getId().toString()));
//						logger.info("loadVideoBaseInfo	加载栏目名称-视频ID数据	key:{},value:{}",new Object[]{key,item.getId()});
//					}
//				}
//			}
//			
//			pipeline.sync();
//		}
//		catch (Exception e) {
//			logger.error("loadVideoBaseInfo异常:" ,e);
//		}
//		finally {
//			if (jedis != null) {
//				redisUtil.returnJedis(jedis);
//			}
//		}
//	}
	
//	@SuppressWarnings("deprecation")
//	private double getInterByVideoTime(Time time){
//		long videoTime = 0;
//		if(time!=null){
//			 videoTime = time.getHours()*3600+time.getMinutes()*60+time.getSeconds();
//		}
//		double price = VideoConfigConstant.PriceRange.getIntergralByTime(videoTime);
//		price = price*VideoConfigConstant.IntergralRat;
//		return price;
//	}
	
	/**
	 * 加载所有的视频附加信息 videoId - videoAttachObj
	 */
//	private void loadVideoAttachInfo(){
//		List<VideoAttachInfo> list = videoMapper.queryAllVideoAttachInfo();
//		if(list == null || list.size() == 0) {
//			return ;
//		}
//		
//		ShardedJedis jedis = null;
//		try {
//			jedis = redisUtil.getJedis();
//			ShardedJedisPipeline pipeline = jedis.pipelined();
//			String key,value;
//			for (VideoAttachInfo item : list) {
//				key = RedisKeys.VIDEO_ATTACH_PREFIX + item.getId();
//				value = JsonUtil.toJson(item);
//				pipeline.set(SafeEncoder.encode(key), SafeEncoder.encode(value));
//			 	logger.info("loadVideoAttachInfo	加载视频附属数据	key:{},value:{}",new Object[]{key,value});
//			}
//			
//			pipeline.sync();
//		}
//		catch (Exception e) {
//			logger.error("loadVideoAttachInfo异常:" ,e);
//		}
//		finally {
//			if (jedis != null) {
//				redisUtil.returnJedis(jedis);
//			}
//		}
//	}
//	
	
}
